opencv像素值运算

您所在的位置:网站首页 曲线角点检测 cpda opencv像素值运算

opencv像素值运算

2023-09-14 06:56| 来源: 网络整理| 查看: 265

c++ opencv像素值运算–辅助文档角点判断

现有一组vector< Point > 类型的corners 角点坐标(通过拟合文档边框,计算交点获得) 还有一Mat类型的二值化文档轮廓图(将文档图片经过Canny轮廓提取+findContours() 轮廓检测函数处理获得) 由于角点是以霍夫变换后的直线计算交点得来的,所以有些点并不在真正的文档角点上,需要判断哪些角点找对了位置,哪些没有。

为此暂时考虑尝试通过 获取文档轮廓图中 的角点附近 像素值的方法进行计算。

文档轮廓图(二值化)如下

在这里插入图片描述

首先参考Mat类型图像的像素点访问方法

代码如下:

写出获取角点附近8*8像素点的方式

//vector corners;//角点 //Mat Outlineimg;//二值图 Mat PointMat(Size(8, 8), Outlineimg.type());//8*8矩阵 用于存储角点附近图像 int BeginY = corners[num].y - 4, BeginX = corners[num].x - 4;//取点起始位 int EndY = corners[num].y + 4 , EndX = corners[num].x + 4;//取点终止位 for (int i = BeginY ; i PointMat.at(i - BeginY, j - BeginX) = Outlineimg.at(i, j); } } imshow("show PointMat", PointMat);//打印角点附近图像

显示的角点附近图像如下:

在这里插入图片描述

存在问题:如果角点为与图像边界相邻的点时,那么在访问图像像素的时候,就可能发生访问越界的情况,而导致程序崩溃

解决方法:可以根据corners角点当前坐标与Mat图像尺寸来计算获取角点附近8*8像素图像所需的偏移量

代码如下

vector DocScan::CalPixValue(Mat& Outlineimg, vector& corners)//计算corners的像素值 { Mat PointMat(Size(8, 8), Outlineimg.type()); vector Markcorners; for (char num=0;num dx = 4 - corners[num].x; }else if (Outlineimg.cols - corners[num].x dy = 4 - corners[num].y; }else if (Outlineimg.rows - corners[num].y for (int j = BeginX; j ++whitenum; } } } if (whitenum >= 9)//如果白色像素数量>=9则可能为角点(不是太准确,具体参数根据个人需求修改) { cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3